#ifndef POINT_H
#define POINT_H

#include <iostream>
#include <vector>
#include <math.h>

using namespace std;

class point
{
public:
    double value = 0;
    double x = 0, y = 0;
    int indisk = 0, insquare = 0;
    /*insquare =
    0代表在方形边界内 /
    -1 表示在角落 /
    1,2,3,4分别代表左右上下边界*/
    point() {}
    point(double _x, double _y) : x(_x), y(_y) { whether_in_square(); }

    void set(double _x, double _y);
    bool operator==(point _p);
    double distance(point _p); // 两点之间距离
    void whether_in_square();
};

void point::set(double _x, double _y)
{
    x = _x;
    y = _y;
    whether_in_square();
}

bool point::operator==(point _p)
{
    if (fabs(_p.x - x) > 1e-12)
        return false;
    if (fabs(_p.y - y) > 1e-12)
        return false;
    return true;
}

double point::distance(point _p) // 两点之间距离
{
    double dis_x = abs(x - _p.x);
    double dis_y = abs(y - _p.y);
    if (dis_x == 0 || dis_y == 0)
        return dis_x + dis_y;
    else
        return sqrt(pow(dis_x, 2) + pow(dis_y, 2));
}

void point::whether_in_square()//贴标签
{
    if (x > 1e-12 && x < 1 - 1e-12 && y > 1e-12 && y < 1 - 1e-12)
        insquare = 0;
    else
    {
        if (x < 1e-12 && y > 1e-12 && y < 1 - 1e-12) // left
            insquare = 1;
        else if (abs(1.0 - y) < 1e-12 && x > 1e-12 && x < 1 - 1e-12) // up
            insquare = 3;
        else if (abs(1.0 - x) < 1e-12 && y > 1e-12 && y < 1 - 1e-12) // right
            insquare = 2;
        else if (y < 1e-12 && x > 1e-12 && x < 1 - 1e-12) // bottom
            insquare = 4;
        else
            insquare = -1;
    }
}

#endif